package com.algorithm.link;/*
 *@Author:DOWN
 *@Date:2021/12/29 15:32
 *@Comment:LeetCode 203 给你一个链表的头节点 head 和一个整数 val ，请你删除链表中所有满足 Node.val == val 的节点，并返回 新的头节点 。
 */

public class Solution {
    /**
     * 测试用例
     * [1,2,6,3,4,5,6]  含有两个一
     * 6
     *
     * @param head 头节点
     * @param val 目标
     * @return ListNode
     */
    public static ListNode removeElements(ListNode head, int val) {

        //全部为空 退出
        if (null == head) {
            return null;
        }
        //从头.next开始 遍历所有下级节点 排除满足条件的节点
        ListNode view = head;
        while (view.next != null) {
            if (view.next.val == val) {
                view.next = view.next.next;
            } else {
                view = view.next;
            }
        }
        //排除头节点
        if (head.val == val) {
            head = head.next;
        }
        return head;
    }

    /***
     * 加虚拟头节点
     * @param head 虚拟头节点
     * @param val 目标
     * @return ListNode
     */
    public static ListNode removeElements2(ListNode head, int val) {

        ListNode dummyNode=new ListNode(-1);
        dummyNode.next=head;
        //从头.next开始 遍历所有下级节点 排除满足条件的节点
        ListNode view = dummyNode;
        while (view.next != null) {
            if (view.next.val == val) {
                view.next = view.next.next;
            } else {
                view = view.next;
            }
        }
        return dummyNode.next;
    }
    public static void main(String[] arrs) {
        ListNode node = new ListNode(1);
        node.next = new ListNode(4);
        node.next.next = new ListNode(3);
        node.next.next.next = new ListNode(4);
        ListNode view = removeElements(node, 4);
        while (view != null) {
            System.out.println(view.val + "");
            view = view.next;
        }
    }
}

class ListNode {
    int val;
    ListNode next;

    ListNode() {
    }

    ListNode(int val) {
        this.val = val;
    }

    ListNode(int val, ListNode next) {
        this.val = val;
        this.next = next;
    }
}

